package com.xd.clap.exception;

import com.xd.clap.entity.response.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {


    /**
     * 处理自定义异常
     *
     */
    @ExceptionHandler(value = ClapException.class)
    public Result customExceptionHandler(ClapException e) {
        log.error(e.getMessage(), e);
        return Result.customException(e);
    }

    /**
     * 处理自定义异常
     *
     */
    @ExceptionHandler(value = LoginException.class)
    public Result customExceptionHandler(LoginException e) {
        log.error(e.getMessage(), e);
        return Result.fail(e.getErrorCode(),e.getErrorMsg());
    }
    /**
     *处理其他异常
     *
     */
//    @ExceptionHandler(value = Exception.class)
//    public ResultResponse otherExceptionHandler(Exception e) {
//        log.error(e.getMessage(), e);
//        return ResultResponse.otherException(ExceptionEnum.INTERNAL_SERVER_ERROR);
//    }
//
//    /**
//     *参数校验
//     *规范中的验证异常，嵌套检验问题 不带英文方法 类名
//     */
//    @ExceptionHandler(value = ConstraintViolationException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    public ResultResponse constraintViolationException(ConstraintViolationException e){
//        log.warn("ConstraintViolationException:", e);
//        Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
//        String message = violations.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining("/"));
//        return ResultResponse.fail(message);
//    }
//
//    @ExceptionHandler(HttpMessageNotReadableException.class)
//    @ResponseBody
//    public ResultResponse error(HttpMessageNotReadableException e){
//        log.warn("参数错误(json)"+e);
//        return ResultResponse.fail("参数错误(json)");
//    }
//    /**
//     * @description 空参异常处理
//     * @author guanxiangfeng
//     * @date 2023/4/15 21:51
//     * @params [ex, request]
//     * @return com.life.utils.ResultResponse<java.lang.Void>
//     */
//    @ExceptionHandler(BindException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    public ResultResponse<Void> bindException(BindException ex, HttpServletRequest request) {
//        log.warn("BindException:", ex);
//        try {
//            // 拿到@NotNull,@NotBlank和 @NotEmpty等注解上的message值
//            String msg = Objects.requireNonNull(ex.getBindingResult().getFieldError()).getDefaultMessage();
//            if (StrUtil.isNotEmpty(msg)) {
//                // 自定义状态返回
//                return ResultResponse.fail(MessageEnum.PARAMETER_ERROR.getCode(), msg);
//            }
//        } catch (Exception ignored) {
//            log.warn("参数校验空参数"+ex.getMessage());
//        }
//        // 参数类型不匹配检验
//        StringBuilder msg = new StringBuilder();
//        List<FieldError> fieldErrors = ex.getFieldErrors();
//        fieldErrors.forEach((oe) ->
//                msg.append("参数:[").append(oe.getObjectName())
//                        .append(".").append(oe.getField())
//                        .append("]的传入值:[").append(oe.getRejectedValue()).append("]与预期的字段类型不匹配.")
//        );
//        return ResultResponse.fail(MessageEnum.AUTH_FORMAT_ERR.getCode(), msg.toString());
//    }
}

